Invalid operation: nums[j] (type *[]int does not support indexing)

今天学习Go的指针时,出现了错误提示:Invalid operation: nums[j] (type ”*[]int does not support indexing)

实现冒泡排序函数时突然想到PHP的引用,其实也是PHP底层用了指针,所以在这里也试了试,然后出现了下面的错误:

func BubbleSort(nums *[]int) {
    numsCount := len(*nums)
    if numsCount <= 1 {
        return
    }
    for i := 0; i < numsCount; i++ {
        flag := false
        for j := 0; j < numsCount-i-1; j++ {
            if *nums[j] > (*nums)[j+1] {
                (*nums)[j], (*nums)[j+1] = (*nums)[j+1], (*nums)[j]
                flag = true
            }
        }
        if !flag {
            break
        }
    }
}

可以看到错误的代码:

*nums[j]

由于Go会把上面的代码解析成

*(nums[j])

可实质上,我们传入的nums是数组的指针,并不是nums[j]的指针,所以自然会出错

正确的写法:

(*nums)[j]

正确的是:

func BubbleSort(nums *[]int) {
    numsCount := len(*nums)
    if numsCount <= 1 {
        return
    }
    for i := 0; i < numsCount; i++ {
        flag := false
        for j := 0; j < numsCount-i-1; j++ {
            if (*nums)[j] > (*nums)[j+1] {
                (*nums)[j], (*nums)[j+1] = (*nums)[j+1], (*nums)[j]
                flag = true
            }
        }
        if !flag {
            break
        }
    }
}

其实在上面的函数中,传参的类型是切片,所以再使用指针纯粹是多此一举,因为在Golang里,切片和指针都是引用类型,跟PHP不同,不过如果传参改成数组的话,跟PHP是一样的

但是改成数组的话,只能传入等于传参定义好的长度,而且想要获取排序好的数组,同时还需要返回值,比如这样

func BubbleSort(nums [10]int) [10]int {
    numsCount := len(nums)
    for i := 0; i < numsCount; i++ {
        flag := false
        for j := 0; j < numsCount-i-1; j++ {
            if nums[j] > nums[j+1] {
                nums[j], nums[j+1] = nums[j+1], nums[j]
                flag = true
            }
        }
        if !flag {
            break
        }
    }
    return nums
}

也就是说,如果想使用这个函数的话,只能传入等于10长度的数组,复用性不高,但是改成切片的话,复用性就大大提高了,并且不用提供返回值:

func BubbleSort(nums []int) {
    numsCount := len(nums)
    if numsCount <= 1 {
        return
    }
    for i := 0; i < numsCount; i++ {
        flag := false
        for j := 0; j < numsCount-i-1; j++ {
            if nums[j] > nums[j+1] {
                nums[j], nums[j+1] = nums[j+1], nums[j]
                flag = true
            }
        }
        if !flag {
            break
        }
    }
}

PS:使用数组的时候,我用100000长度的数组测试了一下,对于使用了指针和未使用指针的速度对比,测试下来,速度并没有什么变化,按理说应该使用指针后速度会快上不少的,有知道的人可以为我这个初学者解答一下,谢谢!

©著作权归作者所有,转载或内容合作请联系作者